v2.4.0
 - _CryptoNG_RSA_DecryptData() / _CryptoNG_RSA_EncryptData()
   - Added logic to allow the public or private key to be passed as either
     a string containing the file path of the key blob file or as binary
     data containing the key blob.
   - Udated the calltips example file.
   - Updated the CryptoNG Help File.

v2.3.1
- New entry in help file for _CryptoNG_RSA_CreateKeyPairEx()
- Corrected calltip entry for _CryptoNG_RSA_CreateKeyPairEx()

v2.3.0
- Added _CryptoNG_RSA_CreateKeyPairEx($iKeyBitLength, $sRsaPublicKeyPath, $sRsaPrivateKeyPath, $sLegacyPublicKeyPath, $sLegacyPrivateKeyPath[, $sProvider = Default])
  - This function is like _CryptoNG_RSA_CreateKeyPair(), with the addition of exporting both types of blob files at once.
- Added new userudf properties and usercalltips.api
- Changed CreateRSAKeypair example to use new function.

v2.2.1
- Change a couple of global struct definition tags from variables to constants
  since there values are static. (2024-09-28)

v2.2.0 (2024-09-27)
- Fixed a bug in __CryptoNG_IsKeyBitLengthValid() where it was possible
  for Mod() to use a divisor of zero. For the few encryption algorithms that
  can only have 1 key length, like DES & 3DES, it would report a valid key
  length as invalid.  Thanks Konya for reporting the bug.
- Removed trailing CRLF from _CryptoNG_CryptBinaryToString() result.
  By default, the Win32 API (CryptBinaryToStringW) appends a CRLF to all
  results.
- Replaced all references to GCM "Authorization" tag to the correct name,
  "Authentication" tag.  This was purely a documentation issue in the help
  file and function headers.


v2.1.0 (2023-07-29)
- Added ECDSA Signing functions:
  - _CryptoNG_ECDSA_CreateKeyPair
  - _CryptoNG_ECDSA_SignHash
  - _CryptoNG_ECDSA_VerifySignature
- Added ECDSA Signing and Signature Verification examples to the CryptoNG examples file.
  - create_ecdsa_key_pair_example()
  - ecdsa_sign_and_verify_example()
- Added ECDSA Signing and Signature Verification functions to the CryptoNG UDF help file.
- Updated the supplied CryptoNG calltips and userudfs files to include the new ECDSA
  Signing and Signature Verification functions.
- Added new constants to support ECDSA signing functions.
- Moved the version history information from the script to an external file (Version History.txt).
- Misc function header corrections & modifications.
- Misc help file corrections & modifications.


v2.0.0 (2023-07-20)
- Added RSA signing functions using PKCS1 padding:
  - _CryptoNG_RSA_SignHash
  - _CryptoNG_RSA_VerifySignature
- Added internal RSA signing functions to support the new RSA signing functions:
  - __CryptoNG_BCryptSignHash
  - __CryptoNG_BCryptVerifySignature
- Added RSA Signing and Signature Verification examples to the CryptoNG examples file.
  - create_rsa_key_pair_example()
  - rsa_sign_and_verify_example()
- Added RSA Signing and Signature Verification functions to the CryptoNG UDF help file.
- Updated the supplied CryptoNG calltips and userudfs files to include the new RSA
  Signing and Signature Verification functions.
- Added a few new constants
- Misc function header corrections


v1.9.8 (2023-06-03)
- Modified the examples in CryptoNG_Examples.au3 so that the
  functions return upon error, not exit.


v1.9.7 (2022-11-15)
- Modified logging to write to a GUI console instead of to Notepad.
  This eliminates having to add Win11-specific logic since it uses
  a different control class name.
- No changes were made to CryptoNG.au3


v1.9.6 (2022-09-18)
- _CryptoNG_AES_GCM_DecryptData:  Added an explicit authorization
  tag length validation.
- Updated the _CryptoNG_AES_GCM_DecryptData help file entry to
  show the new @error (8) when the auth tag length is invalid.


v1.9.5 (2022-09-12)
- Added new algorithm-specific functions
  - _CryptoNG_AES_GCM_DecryptData
  - _CryptoNG_AES_GCM_EncryptData
- Added new internal functions that support the new AES GCM functions
  - __CryptoNG_IsAuthTagByteLengthValid
  - __CryptoNG_BCryptDecrypt_AES_GCM
  - __CryptoNG_BCryptEncrypt_AES_GCM
- Added an AES GCM example to the CryptoNG examples file.
- Added AES GCM functions to the CryptoNG UDF help file.
- Updated the supplied CryptoNG calltips and userudfs files.
- Optimized __CryptoNG_IsKeyBitLengthValid() function.
- Misc function header corrections/modifications


v1.9.4 (2022-02-22)
- Modified _CryptoNG_GenerateRandom() edit to make sure that the
  supplied number of bytes is a positive integer.


v1.9.3 (2021-08-14)
- Added 2 new algorithm-specific functions.
  - _CryptoNG_AES_ECB_EncryptData
  - _CryptoNG_AES_ECB_DecryptData
- Added an AES ECB example to the example file.
- Added AES ECB functions to the UDF help file.
- Modified helper functions to accommodate AES ECB functions.
- Updated the supplied calltips and userudfs files.
- Misc aesthetic modifications to the code


v1.9.2 (2021-06-07)
- Fixed a typo in the DllOpen for Bcrypt.dll (Thanks Argumentum)


v1.9.1 (2021-06-07)
- Removed internal __CryotNG_Startup and __CryotNG_Shutdown functions.  They were
  replaced with new helper functions to get & close DLL handles.
  - __CryptoNG_GetBcryptDllHandle
  - __CryptoNG_CloseBcryptDllHandle
  - __CryptoNG_GetNcryptDllHandle
  - __CryptoNG_CloseNcryptDllHandle
- Added a helper function to enable/disable debug messages.  It is primarily for
  internal use.
  - _CryptoNG_Debug
- Updated the help file to include the _CryptoNG_Debug function.
- Added a user.calltips.api file and a userudfs.properties file that includes
  entries for all of the public CryptoNG functions.
- Small changes to the ouput of a couple of the examples.
- Internal Changes
  - Changed __CryptoNG_BCryptDecrypt_CBC to __CryptoNG_BCryptDecrypt_With_BlockPadding
  - Changed __CryptoNG_BCryptEncrypt_CBC to __CryptoNG_BCryptEncrypt_With_BlockPadding


v1.9.0 (2021-04-14)
- Added helper functions to convert from binary to string and string to binary.
  - _CryptoNG_CryptBinaryToString
  - _CryptoNG_CryptStringToBinary
- Updated the help file to reflect the new helper functions and their constants.
- Added examples of the new helper functions to the CryptoNG_Examples.au3 file.


v1.8.5 (2021-04-12)
- Script-breaking change
  - Changed function name from _CryptoNG_CreateRSAKeyPair to _CryptoNG_RSA_CreateKeyPair to match the naming
    standards.
  - Updated the help file to reflect the name change.
  - Updated the CryptoNG_Examples.au3 file to reflect the name change.


v1.8.0 (2021-04-12)
- Added asymmetric (public/private key) RSA encryption/decryption functions
  - _CryptoNG_RSA_EncryptData
  - _CryptoNG_RSA_DecryptData
  - __CryptoNG_BCryptEncrypt_RSA (internal)
  - __CryptoNG_BCryptDecrypt_RSA (internal)
  - __CryptoNG_BcryptImportKeyPair (internal)
- Modified _CryptoNG_CreateRSAKeyPair to be able to select the export format (LEGACY/CryptoAPI-Compatible or RSA)
- Added create_legacy_rsa_key_pair_example to the example file
- Added rsa_public_private_key_encrypt_decrypt_data_example to the example file
- Updated the help file to reflect the modifications above.


v1.7.0 (2020-10-20)
- Added open/close of ncrpyt.dll to the Startup & Shutdown functions
- Added additional debug logging to startup & shutdown functions
- Corrected some function headers
- Added new function: _CryptoNG_EnumKeyStorageProviders
- Added new function: __CryptoNG_NCryptFreeBuffer


v1.6.2 (2020-07-12)
- Added additional function parameter validation to prevent the issue reported by @RTFC where passing empty
  strings to some functions was causing DllStructCreate failures.

- Reverted all DllStructGetData & DllStructSetData functions back to dot-notation.


v1.6.1 (2020-07-11)
- Reverted all dll struct gets & sets from dot-notation back to DllStructGetData & DllStructSetData.  Using
  dot-notation caused object initialization errors when value was set to an empty string. (Reported by RTFC)


v1.6.0 (2020-07-10)
- Added the ability to handle data that contains multi-byte characters. (Reported by RTFC)
- Removed all AU3CHECK warnings.
- Added a new example to show the encryption/decryption of strings with multi-byte characters:
  aes_cbc_encrypt_decrypt_multibyte_example()
- Added multi-byte characters to the example Word .docx so that the example script that encrypts/decrypts a file
  shows that it can handle multi-byte characters.
- The example scripts used to write their output to the console.  The Scite4AutoIt's editor does not display multi-
  byte characters in the message area.  So the example scripts now sends messages to notepad, which does handle
  multi-byte characters.  (Best to use a monospaced font in Notepad, like Consolas, so that the message formatting
  displays correctly)
- Removed a few examples whose functionality was duplicated in other example scripts.


v1.5.5 (2020-05-11)
- Changed DllStructGetData & DllStructSetData frunctions to dot-notation. (i.e $tStruct.data)
- Remove __CryptoNG_ConvertByteBuffer function.  It was no longer needed after some code refactoring.
- Add some constants and a new structure in preparation for authenticated ciphers.
- Refactored several DLL calls. Changed "ptr DllstructGetPtr" to "struct* $tStruct".


v1.5.0 (2020-04-20)
- Added the following algorithm specific functions:
  - _CryptoNG_3DES_CBC_DecryptData
  - _CryptoNG_3DES_CBC_DecryptFile
  - _CryptoNG_3DES_CBC_EncryptData
  - _CryptoNG_3DES_CBC_EncryptFile
  - _CryptoNG_AES_CBC_DecryptData
  - _CryptoNG_AES_CBC_DecryptFile
  - _CryptoNG_AES_CBC_EncryptData
  - _CryptoNG_AES_CBC_EncryptFile
- Added the following internal functions to handle block cipher encryption and decryption:
  - __CryptoNG_BCryptDecrypt_With_BlockPadding
  - __CryptoNG_BCryptEncrypt_With_BlockPadding
- Cleaned up some function headers.
- Fixed a small bug in how the size of the IV buffer was being determined when doing block cipher encryption
  and decryption. The length of the IV should match the algorithm's block size, not its key size.
  NOTE: The bug did NOT affect the accuracy of the results, just the size of the buffer.
- Corrected $CNG_KEY_BIT_LENGTH_3DES constant value.  The value was changed from 168 to 192.  168 was the
  usable/logical bit length but the actual bit length is 192.


v1.4.0 (2020-04-03)
- Added a Help file that includes all of the functions, with examples.  The look & feel of the
  new help file matches the AutoIt help files.
- Cleaned up several of the function headers.
- Added logic to _CryptoNG_DecryptFile to create the output file's path if it doesn't exist.
- Added logic to _CryptoNG_EncryptFile to create the output file's path if it doesn't exist.


v1.3.0 (2020-02-24)
- Added _CryptoNG_GenerateRandom and supporting internal function.  (Suggested by PeterPE)


v1.2.0 (2020-01-25)
- Added _CryptoNG_CreateRSAKeyPair and supporting internal functions, constants, and structures.
  (Suggested by Network_Guy)


v1.1.1 (2019-12-03)
- Corrected the _CryptoNG_PBKDF2 function header.  The syntax line was using the syntax for the
  _CryptoNG_HashData function.
- Changed variable name in the _CryptoNG_PBKDF2 function from $iKeyBitLength to $iDKeyBitLength
  to more aptly describe its meaning, desired key bit length.


v1.1.0 (2019-12-02)
- Cleaned up the __CryptoNG_Startup & __CryptoNG_Shutdown functions. (Suggested by argumentum)
- Added the abiliity to specify a desired algorithm provider when encrypting, decrypting, hashing, or using the
  PBKDF2 function. (Suggested by mLipok)


v1.0.0 (2019-12-01)
- Initial release
